#include  "dht11.h"
#include "iic_basen32lib.h"
#include <stdio.h>
 
/**
 * @brief  Inserts a delay time.
 * @param count specifies the delay time length.
 */
//void delay_us(uint32_t count) //实际的延时时间你要自己用串口助手调一下 这是64M主频的软延时
//{
//    count=(count*4);
 
 
 
 
//    for (; count > 0; count--)
//    {
//        __nop();
//        __nop();
//        __nop();
//        __nop();
//        __nop();
//        __nop();
//        __nop();
//        __nop();
//        __nop();
 
 
//    }
//}
//void delay_ms(uint32_t count)
//{
//    for (; count > 0; count--)
//   {
//        delay_us(1006);
//   }
//}
//数据
unsigned int rec_data[4];
 
 
void DH11_GPIO_Init_OUT(void)
{
	 GPIO_InitType GPIO_InitStructure ;   /*初始化GPIO结构体*/
	 GPIO_InitStruct(&GPIO_InitStructure);
 
	 GPIO_InitStructure.Pin            =  GPIO_PIN_12 ;
	 GPIO_InitStructure.GPIO_Current   = GPIO_DC_4mA;
	 GPIO_InitStructure.GPIO_Pull      = GPIO_No_Pull;
	 GPIO_InitStructure.GPIO_Mode      =  GPIO_Mode_Out_PP;
	 GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;//以高速50M速率为例 翻转电平仅需20ns
 
	 GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
 
}
 
 
void DH11_GPIO_Init_IN(void)
{
	GPIO_InitType GPIO_InitStructure ;   /*初始化GPIO结构体*/
	 GPIO_InitStruct(&GPIO_InitStructure);
 
	 GPIO_InitStructure.Pin            =  GPIO_PIN_12 ;
	 GPIO_InitStructure.GPIO_Current   =  GPIO_DC_4mA;
	 GPIO_InitStructure.GPIO_Pull      =  GPIO_No_Pull;
	 GPIO_InitStructure.GPIO_Mode      =  GPIO_Mode_Input;
	 GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;//以高速50M速率为例 翻转电平仅需20ns
 
	 GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
 
}
 
 
 
//主机发送开始信号
void DHT11_Start(void)
{
	DH11_GPIO_Init_OUT(); //输出模式
 
	dht11_high; //先拉高
	delay_us(30);
 
	dht11_low; //拉低电平至少18us
	delay_ms(20);
 
	dht11_high; //拉高电平20~40us
	delay_us(30);
 
	DH11_GPIO_Init_IN(); //输入模式
}
 
 
//获取一个字节
char DHT11_Rec_Byte(void)
{
	unsigned char i = 0;
	unsigned char data;
 
	for(i=0;i<8;i++) //1个数据就是1个字节byte，1个字节byte有8位bit
	{
		while( Read_Data == 0); //从1bit开始，低电平变高电平，等待低电平结束
		delay_us(30); //延迟30us是为了区别数据0和数据1，0只有26~28us
 
		data <<= 1; //左移
 
		if( Read_Data == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
 
		while( Read_Data == 1 ); //高电平变低电平，等待高电平结束
	}
 
	return data;
}
 
//获取数据
 
void DHT11_REC_Data(void)
{
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,CHECK;
 
	DHT11_Start(); //主机发送信号
	dht11_high; //拉高电平
 
	if( Read_Data == 0 ) //判断DHT11是否响应
	{
		while( Read_Data == 0); //低电平变高电平，等待低电平结束
		while( Read_Data == 1); //高电平变低电平，等待高电平结束
 
		R_H = DHT11_Rec_Byte();
		R_L = DHT11_Rec_Byte();
		T_H = DHT11_Rec_Byte();
		T_L = DHT11_Rec_Byte();
		CHECK = DHT11_Rec_Byte(); //接收5个数据
 
		dht11_low; //当最后一bit数据传送完毕后，DHT11拉低总线 50us
		delay_us(55); //这里延时55us
		dht11_high; //随后总线由上拉电阻拉高进入空闲状态。
 
		if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比，判断校验接收到的数据是否正确
		{
			RH = R_H;
			RL = R_L;
			TH = T_H;
			TL = T_L;
		}
	}
	rec_data[0] = RH;
	rec_data[1] = RL;
	rec_data[2] = TH;
	rec_data[3] = TL;
	
	printf("temp:%d.%d‘C, humi:%d.%d%%\r\n",rec_data[0],rec_data[1],rec_data[2],rec_data[3]);
}
 